<?php

namespace app\admin\model;

use think\Model;


class Product extends BaseModel
{

    public $schema = [
        'id' => 'int', // 主键ID
        'sku' => 'varchar(60)', // 商品SKU
        'cname' => 'varchar(255)', // 官方商品名称
        'abbr' => 'varchar(255)', // 商品简称
        'code' => 'varchar(50)', // 商品编码
        'style_code' => 'varchar(50)', // 款式编码
        'category' => 'varchar(9)', // 分类(d_category数据字典)
        'brand' => 'varchar(9)', // 品牌(d_brand数据字典)
        'color_specs' => 'varchar(50)', // 颜色及规格
        'condition' => 'char(1)', // 是否二手机(0-否 1-是)
        'expiration_date' => 'int', // 保修期(天数)
        'hashrate' => 'decimal(10,2)', // 算力
        'computing_unit' => 'int', // 算力单位(d_computing)
        'power' => 'int', // 功耗w
        'weight' => 'decimal(10,2)', // 祼机净重量(kg)
        'gross_weight' => 'decimal(10,2)', // 带包装的毛重量(kg)
        'billing_weight' => 'decimal(10,2)', // 计费重量 （KG）
        'dimensions' => 'varchar(255)', // 祼机尺寸(cm) 长*宽*高
        'gross_dimensions' => 'varchar(255)', // 带包装尺寸(cm)长*宽*高
        'volume' => 'decimal(10,2)', // 带包装体积
        'freight_tag' => 'tinyint', // 运费标记(L,S,H,T)
        'model_id' => 'bigint unsigned', // 矿机型号ID[db_model_info中的id]
        'main_photo' => 'int', // 商品照片
        'photo' => 'varchar(2000)', // 商品照片(多张照片逗号分隔)
        'describe' => 'text', // 描述
        'remark' => 'varchar(255)', // 备注
        'min_num' => 'int', // 最少起购数量
        'estimated_ship_date' => 'int', // 预计发货时间(天数)
        'cost' => 'decimal(10,2)', // 成本
        'sales_rate' => 'decimal(10,2)', // 销售汇率
        'sales_price_futures' => 'decimal(10,2)', // 商品期货价格(用于回显)
        'sales_price' => 'decimal(10,2)', // 销售价(成本*销售汇率)
        'freight_price' => 'decimal(10,2)', // 运费金额(销售价*0.93)
        'is_advance' => 'char(1)', // 是否支持预付款(0-否 1-是)
        'advance_ratio' => 'int', // 预付款比率
        'creator' => 'int', // 创建人
        'create_time' => 'datetime', // 创建时间
        'updater' => 'int', // 更新人
        'update_time' => 'datetime', // 更新时间
        'is_del' => 'int', // 0-正常，时间戳-已删除
        'status' => 'char(1)', // 状态(0-下架 1-上架)
        'type' => 'char(1)', // 商品类型(1商品  2配件)
        'unit' => 'tinyint', // 单位
        'has_powersource' => 'tinyint', // 是否有电源 0 - 没有 1 - 有
        'has_powerline' => 'tinyint', // 是否有电源线 0 - 没有 1 - 有
        'powerline_specs' => 'varchar(50)', // 电源线规格
        'powerline_standards' => 'tinyint', // 电源线标准 1 - 国标 2 - 美标 3 - 欧标 4 - 英标 5 - 其他
        'memory_size' => 'int', // 内存(G)
        'chip_number' => 'int', // 芯片数量
        'working_mode' => 'varchar(100)', // 工作模式
        'algorithm' => 'varchar(100)', // 支持算法(允许多选,逗号分隔)
        'working_voltage' => 'varchar(100)', // 工作电压
        'noise_level' => 'varchar(100)', // 噪音水平
        'network_conn_method' => 'varchar(100)', // 网络连接方式
        'operation_temperature' => 'varchar(100)', // 工作温度
        'working_humidity' => 'varchar(100)', // 工作湿度
        'colling_method' => 'varchar(100)', // 制冷方式
        'bare_macheine_size' => 'varchar(100)', // 裸机尺寸(MM)
        'package_size' => 'varchar(100)', // 包装尺寸(MM)
        'free_shipping' => 'tinyint', // 是否包邮 1 - 是 0 – 否
        'apply_rules' => 'tinyint', // 是否应用我司物流规则 1 - 是 0 – 否
        'contain_battery' => 'tinyint', // 是否含电池(配件专用) 1 - 是 0 – 否
        'has_magnetic' => 'tinyint', // 是否带磁性  1 - 是 0 - 否 (配件专用)
        'release_date' => 'int', // 发布时间
    ];





    protected $attributes = [
        'unit' => [
            1 => '件',
            2 => '台',
            3 => '个',
            4 => 'PiB'
        ],
        'freight_tag' => [
            1 => 'H',
            2 => 'L',
            3 => 'S',
            4 => 'T'
        ],
        'model' => [
            1 => 'SM',
            2 => 'MD',
            3 => 'LG'
        ],
        'comput_unit' => [
            1 => 'h/s',
            2 => 'Kh/s',
            3 => 'Mh/s',
            4 => 'Gh/s',
            5 => 'Th/s',
            6 => 'Ph/s',
            7 => 'Eh/s'
        ],
        'has_powersource' => [
            0 => '没有',
            1 => '有'
        ],
        'has_powerline' => [
            0 => '没有',
            1 => '有'
        ],
        'powerline_standards' => [
            1 => '国标',
            2 => '美标',
            3 => '欧标',
            4 => '英标',
            5 => '其他'
        ]
    ];

    protected $enumCallbacks = [
        'model' => 'getModelEnum',
        'brand' => 'getBrandEnum'
    ];

    /**
     *  获取机型枚举
     */
    public function getModelEnum()
    {
        return ModelInfo::order('model_name ASC')
            ->column('id as value,model_name as label');
    }

    //
    // 定义 BeforeInsert 事件
    public static function onBeforeInsert($product)
    {
        // 检查 brand 字段是否存在
        if (array_key_exists('brand', $product->getData())) { // 使用 getData() 检查
            if ($product->getData('brand') === null) {
                $product->setAttr('brand', null);  // 确保 brand 字段保持 null
            }
        }
    }

    // 定义 BeforeUpdate 事件
    public static function onBeforeUpdate($product)
    {
        // 更新前确保 null 值不会被转换
        if (array_key_exists('brand', $product->getData())) { // 使用 getData() 检查
            if ($product->getData('brand') === null) {
                $product->setAttr('brand', null);  // 确保 brand 字段保持 null
            }
        }
    }

    public function getUnitValueAttr($value, $data)
    {
        if ($data['unit']) {
            return isset($this->attributes['unit'][$data['unit']]) ? $this->attributes['unit'][$data['unit']] : '';
        }
        return '';
    }

    public function getStatusAttr($value, $data)
    {
        return (int)$value;
    }

    public function getIsAdvanceAttr($value, $data)
    {
        return (int)$value;
    }

    public function getConditionTextAttr($value, $data)
    {
        return $data['condition'] == 1 ? '是' : '否';
    }

    public function getIsAdvanceTextAttr($value, $data)
    {
        return $data['is_advance'] == 1 ? '是' : '否';
    }

    public function creator()
    {
        return $this->getOperator()->bind(['nickname']);
    }

    public function getOperator()
    {
        return $this->hasOne(Operator::class, 'id', 'creator');
    }

    public function getCategory()
    {
        return $this->hasOne(ProductCategory::class, 'id', 'category');
    }

    public function getCategoryValue()
    {
        return $this->hasOne(ProductCategory::class, 'id', 'category')->bind(['category_value' => 'name']);
    }

    public function getBrandValue()
    {
        return $this->hasOne(ProductBrand::class, 'id', 'brand')->bind(['brand_value' => 'name']);
    }

    /**
     *  关联模型名称
     */
    public function modelValue()
    {
        return $this->hasOne(ModelInfo::class, 'id', 'model_id');
    }

    public function getBrand()
    {
        return $this->hasOne(ProductBrand::class, 'id', 'brand');
    }

    public function getBrandName()
    {
        return $this->getBrand()->bind(['brand_name' => 'name']);
    }

    public function getBrandAttr($value, $data)
    {
        if ($value > 0) {
            return (int)$value;
        }
    }

    public function getParentName()
    {
        return $this->hasOne(self::class, 'id', 'pid')->bind(['product_name' => 'cname']);
    }

    public function getCurrency()
    {
        return $this->hasMany(ProductCurrencyLink::class, 'productid', 'id')->with('get_currency_name');
    }

    public function getInventory()
    {
        return $this->hasMany(Inventory::class, 'productid', 'id')->with('discount');
    }

    // /* 枚举方法开始 */
    public function getBrandEnum()
    {
        $brand = ProductBrand::where('is_del', 0)->column('id,name');
        foreach ($brand as $value) {
            $formattedBrands[] = [
                'value' => $value['id'],
                'label' => $value['name']
            ];
        }
        return $formattedBrands;
    }

    /* 枚举方法结束 */

    public function getFieldEnum($field)
    {
        return parent::getEnum($field);
    }

    public function getFieldEnumBynew($field)
    {
        $res = parent::getEnum($field, [], 'label');

        if ($field == 'algorithm' ||   strtolower($field)  == 'all') {
            $algorithmModel = new Algorithm();
            $algorithm = $algorithmModel->getEnum('algorithm', [], 'label');
            $res = array_merge($res, $algorithm);
        }
        return $res;
    }

    /**
     *  获取枚举字段
     */
    public function getAttributes($field)
    {
        if (isset($this->attributes[$field])) {
            $enum = $this->attributes[$field];
            if (is_array($enum)) {
                return $enum;
            }
        }
    }
}
